package java学习.反射;

import java学习.Cat;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * **************
 * 项目名称: 蓝桥杯 <br/>
 * 文件名称:  <br/>
 * 文件描述: 这里添加您的类文件描述，说明当前文件要包含的功能。 <br/>
 * 文件创建：刘世锦 <br/>
 * 创建时间: 2022/4/8 <br/>
 *
 * @version v1.0 <br/>
 * @update [序号][日期YYYY-MM-DD][更改人姓名][变更描述]<br/>
 * *************
 */
public class TestRefleftion {
    public static void main(String[] args) {

        try {

            Class<?> aClass = Class.forName("java学习.Cat");
            String name = aClass.getName();
            System.out.println("该aclass对应的类："+name);
            System.out.println("该aclass对应的包："+aClass.getPackageName());
            System.out.println("该aclass对应的包："+aClass.getPackage());



            Object o = aClass.newInstance();
            System.out.println("实例化对象"+o);
            Method cry = aClass.getMethod("cry",String.class);
            Object invoke = cry.invoke(o,"haha");
            System.out.println("aClass对象 所属类："+aClass.getClass());
            System.out.println(Arrays.toString(aClass.getClasses()));


//            获取构造方法
            Constructor<?> constructor = aClass.getConstructor();
            System.out.println(constructor); // 默认是无参构造
            Constructor<?> constructor1 = aClass.getConstructor(Integer.class, String.class);
            System.out.println(constructor1);
            Object o1 = constructor1.newInstance(2,"毛毛");
//          Object o1 = constructor1.newInstance(new Object[]{2,"毛毛"});
            System.out.println(o1);

//          获取类的成员变量/属性
            // 只能访问public
//            Field 'CAge' is not public
            Field Cname = aClass.getField("Cname");
//          获取某个属性 在某个实例化对象 所定义的值
            System.out.println(Cname.get(o1));
            // 设置参数
            Cname.set(o1,"嘻嘻");
            System.out.println(o1);
            System.out.println("=========================");
            System.out.println("静态属性获取：");
            Field cName = aClass.getField("cName");
            System.out.println(cName.getName()+"="+cName.get(null));
            System.out.println("=========================");
//          参数数组
            Field[] fields = aClass.getFields();
            System.out.println(Arrays.toString(fields));
            for(Field f : fields){
                System.out.println(f.getName()+":"+f.get(o1));
            }


            System.out.println("===============");
            Map<String, String> map = new HashMap<>();
        map.put("邓超", "孙俪"); map.put("王宝强", "马蓉"); map.put("宋喆", "马蓉"); map.put("刘令博", null); map.put(null, "刘亦菲"); map.put("鹿晗", "关晓彤");
            System.out.println(map);
            Class<? extends Map> aClass1 = map.getClass();
            System.out.println(Arrays.toString(aClass1.getClasses()));
            /*
          todo   返回一个数组，其中包含 {@code Class} 对象，
            这些对象表示作为此 {@code Class} 对象所表示的类的成员的所有公共类和接口。
            这包括从超类继承的公共类和接口成员以及类声明的公共类和接口成员。
             */




            ClassLoader classLoader = aClass.getClassLoader();
            Class<? extends ClassLoader> aClass2 = classLoader.getClass();

            ClassLoader classLoader1 = Cat.class.getClassLoader();
            Class<? extends ClassLoader> aClass3 = classLoader1.getClass();

            Class<?> aClass4 = classLoader1.loadClass("java学习.Cat");

            System.out.println(aClass2.hashCode()+""+aClass2.getName());
            System.out.println(aClass3.hashCode()+""+aClass3.getName());
            System.out.println(aClass4.hashCode()+""+aClass4.getName());


            Class int1 = int.class;
                Class b = Boolean.TYPE;
            Class<Void> voidClass = void.class;

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
